package com.gl.glcourses.services.impl;


import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.flex.remoting.RemotingDestination;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.gl.glcourses.mail.impl.SendCrearVotacion;
import com.gl.glcourses.mail.impl.SendRecordatorioVotar;
import com.gl.glcourses.mail.impl.SendUsuarioSinOficina;
import com.gl.glcourses.repository.IVotacionCursoRepository;
import com.gl.glcourses.repository.IVotacionRepository;
import com.gl.glcourses.repository.IVotoRepository;
import com.gl.glcourses.services.IVotacionServices;
import com.gl.glcourses.vos.Confirmacion;
import com.gl.glcourses.vos.Curso;
import com.gl.glcourses.vos.Usuario;
import com.gl.glcourses.vos.Votacion;
import com.gl.glcourses.vos.VotacionCurso;
import com.gl.glcourses.vos.Voto;
import com.gl.glcourses.vos.constants.Constants;

@Transactional
@RemotingDestination(channels = { "my-amf" })
@Service
public class VotacionServices implements IVotacionServices{
	
	@Autowired
	IVotacionRepository repoVotacion;
	@Autowired
	IVotacionCursoRepository repoVotacionCurso;
	@Autowired
	IVotoRepository repoVoto;
	@Autowired
	SendCrearVotacion sendCrearVotacion;
	@Autowired
	SendUsuarioSinOficina sendUsuarioSinOficina;
	@Autowired
	SendRecordatorioVotar sendRecordatorioVotar;
	
	@Override
	public Confirmacion crearVotacion(Votacion votacion, List<Curso>listaCursos) throws Exception {
		
		VotacionCurso vCurso;
		Confirmacion confirmacion = new Confirmacion();
		List<VotacionCurso> lisVotacionCursos = new ArrayList<VotacionCurso>();
		for(Curso curso:listaCursos){
			vCurso = new VotacionCurso();
			vCurso.setCurso(curso);
			lisVotacionCursos.add(vCurso);
			vCurso.setVotacion(votacion);
		}
		votacion.setVotacionesCurso(lisVotacionCursos);

		Curso curso = new Curso();
		SimpleMailMessage msg = new SimpleMailMessage();
		Map<Object, Object> hTemplateVariables = new HashMap<Object, Object>();
		hTemplateVariables.put(Constants.USUARIOS, votacion.getUsuarios());
		hTemplateVariables.put("cursos", listaCursos);
		hTemplateVariables.put("curso", curso);
		hTemplateVariables.put("votacion", votacion);
		msg.setSubject("Invitacion a Votacion de cursos");
		sendCrearVotacion.send(msg, hTemplateVariables);
		repoVotacion.saveUpdate(votacion);
		confirmacion.setEstado(Constants.CONFIRMACION_OK);
		
		return confirmacion;
	}
	
	@Override
	public Votacion buscarVotacion(Votacion votacion) throws Exception {
		
		Confirmacion confirmacion = new Confirmacion();
		
		try {
			return (Votacion)repoVotacion.findById(votacion.getId(), Votacion.class);
		} catch (Exception e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}
		return null;
	}

	@Override
	public List<Votacion> listarVotaciones() throws Exception {
		return (List<Votacion>)repoVotacion.getListEntity(Votacion.class);
	}

	@Override
	public Confirmacion notificacionRecordatorioVotar() throws Exception{
		
		Confirmacion confirmacion = new Confirmacion();
		List<Votacion> votacionesAbiertas = new ArrayList<Votacion>();

		votacionesAbiertas = repoVotacion.buscarVotacionesAbiertas();
		
		for(Votacion searchVotacion:votacionesAbiertas){
			List<Usuario> usuariosRecordatorios = new ArrayList<Usuario>();
			List<Usuario> usuarios = searchVotacion.getUsuarios();

			List<Voto> votos = repoVoto.buscarVotos(searchVotacion);
			
			for(Usuario searchUsuario:usuarios){
				boolean elUsuarioVoto = false;
				
				for(Voto searchVoto:votos){
					if(searchUsuario.getId() == searchVoto.getUsuario().getId()){
						elUsuarioVoto = true;
					}
				}
				
				if(!elUsuarioVoto){
					usuariosRecordatorios.add(searchUsuario);
				}
			}
			
			if(usuariosRecordatorios.size() > 0)
			{
				SimpleMailMessage msg = new SimpleMailMessage();
				Map<Object, Object> hTemplateVariables = new HashMap<Object, Object>();
				hTemplateVariables.put(Constants.USUARIOS, usuariosRecordatorios);
				hTemplateVariables.put("votacion", searchVotacion);
				msg.setSubject("Le recordamos que debe votar");
				sendRecordatorioVotar.send(msg, hTemplateVariables);
				confirmacion.setEstado(Constants.CONFIRMACION_OK);
			}
		}
		return confirmacion;
	}

}
